AWS Glue 実践入門:Amazon Redshiftのテーブルをクロールする
AWS Glue は未知のデータ(Dark Data)に対して、推測(Infer)して、AWS Glue Data Catalog にテーブルを登録する機能があり、これをクローラ(Crawler)として定義します。ガイド付きチュートリアルの中で、カラム名ありパーティション化されたS3オブジェクトをクロールする例をご紹介しています。今回は、Redshiftに対してクロールする方法をご紹介します。
Amazon Redshiftのテーブルをクロールするには
Amazon Redshiftをクロールする前に Connectionを作成します。Connectionとは、データソースとなるRedshiftへの接続情報です。Connection の準備ができたら、AWS GlueはConnectionを利用して、データソースであるRedshiftに接続して、テーブルの定義情報をクロールします。
Connectionの作成
クラスタを指定する方法は2つあります。一つ目は、Amazon Redshiftのクラスタ識別子(Cluster Identifer)指定する方法と、二つ目はJDBC URLとVPCを選択する方法です。何れもAWSアカウントかつリージョン内のVPCを指定することになりますので、前者の方法で接続を定義します。
Connection properties
Amazon Redshiftのクラスタ識別子(Cluster Identifer)指定する方法で定義するので、Connection typeはAmazon Redshift
を選択します。
Connection Action
Clusterにリージョン内のAmazon Redshiftクラスタの一覧が表示されます。定義したいクラスタが表示されない場合は、リージョンやVPCのセキュリ−ティーグループに誤りがないか確認してください。
Review all steps
接続内容の確認です。Connectionの作成は接続先のDB設定の他に、VPCやセキュリティグループも重要です。
Test Connection
Connectionを作成すると一覧に追加されます。追加したConnectionがあ正しく接続できるか確認することをおすすめします。Test Connection
を押すとダイアログが表示され、ガイド付きチュートリアルの中で、Crowlerを作成したときに指定したIAM ROLEを選択して実行してください。「This can take a few moments.」と表示される通り、本当に接続確認だけで数分かかります。
補足
今回は、Redshiftのクラスタ識別子(Cluster Identifer)指定する方法でConnectionを作成しましたが、作成後はJDBC URLとVPCを選択する方法で設定した内容に変換されます。Connectionの編集画面を開くとJDBC URLが表示されます。Redshiftのクラスタ識別子(Cluster Identifer)で定義されているわけではないということに注意してください。
クローラを作成する
では、作成したConnectionを利用して、データソースであるRedshiftに接続して、テーブルの定義情報をクロールします。
Crawler info
今回は、ssbgzスキーマのcustomerテーブルに対してクロールします。
Data store
先程のConnectionはAmazon Redshift
で指定しましたが、ここではData StoreにJDBC
を選択します。Include Path
はMyDatabase/MySchema/MyTableと指定します。今回はxxxxデータベースのssbgzスキーマのcustomerテーブルなので、xxxx/ssbgz/customer と指定します。
※ なお、MyDatabase/MySchema/%と指定することで、スキーマの全てをテーブルを対象とする事ができます。まとめてクロールしたいときにはとても便利な指定です。
IAM Role
ガイド付きチュートリアルの中で、Crowlerを作成したときに指定したIAM ROLEを選択して実行してください。
Schedule
Frequency
は Run on demand を選択します。
Output
クロールした結果、テーブルを作成する先を指定します。AWS Glue Data Catalogのdefaultデータベースに出力します。
Review all steps
設定内容を確認します。
クローラの実行
Run it now
作成したクローラが追加されています。Run it now?
リンクをクリックすると直ちにクロール開始です。
クロールが無事に終了しました。
Redshiftでは以下のクエリが実行されていることが確認できました。
SELECT * FROM (SELECT CAST(current_database() AS VARCHAR(124)) AS TABLE_CAT, table_schema AS TABLE_SCHEM, table_name AS TABLE_NAME, CAST( CASE table_type WHEN 'BASE TABLE' THEN CASE WHEN table_schema = 'pg_catalog' OR table_schema = 'information_schema' THEN 'SYSTEM TABLE' WHEN table_schema = 'pg_toast' THEN 'SYSTEM TOAST TABLE' WHEN table_schema ~ '^pg_' AND table_schema != 'pg_toast' THEN 'TEMPORARY TABLE' ELSE 'TABLE' END WHEN 'VIEW' THEN CASE WHEN table_schema = 'pg_catalog' OR table_schema = 'information_schema' THEN 'SYSTEM VIEW' WHEN table_schema = 'pg_toast' THEN NULL WHEN table_schema ~ '^pg_' AND table_schema != 'pg_toast' THEN 'TEMPORARY VIEW' ELSE 'VIEW' END WHEN 'EXTERNAL TABLE' THEN 'EXTERNAL TABLE' END AS VARCHAR(124)) AS TABLE_TYPE, REMARKS FROM svv_tables) WHERE TABLE_SCHEM like 'ssbgz' AND TABLE_NAME like 'customer' ORDER BY TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME ;
登録されたData Catalogのテーブルを確認
xxxx_ssbgz_customerというテーブル名で登録され、Data type
がHiveのデータ型に変換されています。しかし、このテーブル定義はS3のパスはcmawsteamdb.ssbgz.customerと定義されており、このテーブルに対してAthenaからクエリーを実行できません。
クエリーできないテーブルは一体何か?
xxxx_ssbgz_customerというテーブルは、Redshiftのデータ入出力の定義情報でありテーブルではありません。AWS GlueではETL Jobの入力や出力にこのテーブル名を指定することができます。例えば、ETL Jobの入力にxxxx_ssbgz_customerというテーブルを指定することでデーブルデータをデータソースとすることができるようになります。
最後に
長くなりましたので、クローラで作成したxxxx_ssbgz_customerというテーブルを用いてETL Jobを作成するのは、引き続き以下のブログにて紹介します。